package com.general.framework.core.lang;


import com.general.framework.core.enums.IEnum;

import java.util.HashMap;
import java.util.Map;

/**
 * @author leejean
 * @ClassName: Enums
 * @Description: 根据Enum接口实现一些枚举操作的类
 * @date 2019年09月03 17:12:08
 */
public abstract class Enums {

    /**
     * @param clazz
     * @param value
     * @return 枚举类
     * @Title: parse
     * @Description: 根据枚举类型的值，解析出枚举类
     */
    public static <T extends IEnum<V>, V> T parse(final Class<T> clazz, final V value) {
        if (value == null) {
            return null;
        }

        for (final T t : clazz.getEnumConstants()) {
            if (value.equals(t.value())) {
                return t;
            }
        }
        return null;
    }

    /**
     * 根据枚举型定义的名称或枚举性的值 获取枚举型
     *
     * @param clazz
     * @param named
     * @param <T>
     * @return
     */
    public static <T extends IEnum<?>> T valueOfObject(final Class<T> clazz, final Object named) {
        if (named == null || Strings.isBlank(named.toString())) {

            return null;
        }
        // 需要继承枚举类型和我们自己的接口
        if (!(IEnum.class.isAssignableFrom(clazz) && Enum.class.isAssignableFrom(clazz))) {

            return null;
        }

        final T[] arrEnums = clazz.getEnumConstants();
        if (arrEnums[0] instanceof Enum) {
            for (final T t : arrEnums) {
                final Enum<?> tmpEnum = (Enum<?>) t;
                if (named.equals(tmpEnum.name())) {
                    return t;
                }
            }
        }

        for (final T t : arrEnums) {
            if (named.equals(t.named()) || named.equals(t.value())) {
                return t;
            }
        }

        return null;
    }

    /**
     * 使用枚举型的值返回MAP,使用枚举的值作为Key，枚举作为Value的MAP
     *
     * @param enumClazz
     * @param <T>
     * @return
     */
    public static <T extends IEnum<?>> Map<Object, T> getEnumMap(final Class<T> enumClazz) {
        final T[] arrEnums = enumClazz.getEnumConstants();
        final Map<Object, T> tmpMap = new HashMap<>(arrEnums.length);
        for (final T t : arrEnums) {
            tmpMap.put(t.value(), t);
        }

        return tmpMap;
    }
}
